Android 关于加入Google签名计划(分配的签名文件)Google和Facebook登录不成功的问题

前提:

最近总是看到有人在问发布应用到Google Play之后,签名改变了,然后导致登录不成功的问题。之前没怎么在意,但是,问的人多了之后就想着,既然问的人这么多,那么直接写一篇文章来统一说明一下解决方式。

首先

之前加入到Google签名计划是一个可选项,但是,最近发布的应用好像默认就会分配一个新的签名。这就给我们测试增加了难度,需要使用Google新分配的签名文件的SHA1来重新配置登录需要的文件。这里的登录不仅指的是Google登录还有Facebook登录,因为签名变了之后SHA1也会改变。所以,Google需要更新Android版的AuthID的SHA1,Face book需要更新新的散列密钥

说了那么多,来看看自己的签名和Google分配的签名
![Google签名.png](Android 关于加入Google签名计划(分配的签名文件)Google和Facebook登录不成功的问题/Google签名.png)

如上图所示,可以看到Google分配的签名,这里面会生成新的SHA1MD5SHA-256,那么我们所需要的是什么呢,做过google登录的都知道需要SHA1,那么问题来了。需要用新的SHA1还是自己原来的SHA1呢?当然是要用Google分配的SHA1了。因为我们需要在Google Play上面发布应用。

其次

上面说了那么多的原因,那么下面来看解决办法。

  • 关于Google登录的配置,可以看这篇Google登录配置,如果配置过了,那么看一下如何修改,我们只需要修改Android版的AuthID,并且修改里面对应的SHA1
    ![加入Google签名后修改SHA1的地方.png](Android 关于加入Google签名计划(分配的签名文件)Google和Facebook登录不成功的问题/加入Google签名后修改SHA1的地方.png)
    注意:SHA1这里需要更换成Google分配的签名的SHA1其他的保持不变。

  • 也有同仁遇到过Facebook登录失败的问题,说的是散列密钥错误。那么,我们的散列密钥是怎么生成的呢?

    keytool -exportcert -alias (签名的别名) -keystore (签名文件路径) | openssl sha1 -binary | openssl base64

上面的就是我们生成散列密钥的方法,需要签名的别名和路径,当然还要有密钥。当我们有签名的时候当然会很容易的生成,那么Google分配的签名呢?我们怎么知道别名?怎么知道路径?怎么知道密钥?别担心,这里给你解决方法。

  • 1、这里我根据当前网址的JS源码的算法,自己写出了一套JAVAkotlin源码,当前网址是如下图所示的用法
    ![根据SHA1生成散列密钥.png](Android 关于加入Google签名计划(分配的签名文件)Google和Facebook登录不成功的问题/根据SHA1生成散列密钥.png)

如上图所示,我们只需要填入Google分配给我们的新的SHA1即可生成散列密钥然后填入到Facebook的后台配置中。

  • 2、代码中的用法是如何的呢?且看下面的源码

    java版的

     /**
      * 转换工具类
      */
     public class ConvertUtil {
    
     /**
      * 输入内容
      *
      * @param input   输入的内容
      * @param isCheck 是否取消选择OX
      * @return 返回取消OX后的值
      */
    private static String input(String input, boolean isCheck) {
      input = input.toUpperCase();
      if (isCheck) {
          Pattern pattern = Pattern.compile("0X");
          Matcher matcher = pattern.matcher(input);
          input = matcher.replaceAll("");
      }
      Pattern pattern = Pattern.compile("[^A-Fa-f0-9]");
      Matcher matcher = pattern.matcher(input);
      input = matcher.replaceAll("");
      return input;
    }
    
     /**
      * 转换
      *
      * @param input   输入的内容
      * @param isCheck 是否取消选择OX
      * @return 返回散列密钥
      */
    public static String convert(String input, boolean isCheck) {
      String array;
      String result = input(input, isCheck);
      if (result.length() % 2 != 0) {
          return "123";
      }
      int[] mArray = new int[result.length() / 2];
      for (int index = 0; index < result.length() / 2; index++) {
          String h = result.substring(index * 2, index * 2 + 2);
          Log.e("TA", h + "");
          mArray[index] = Integer.parseInt(h, 16);
      }
      array = convertTo64(mArray);
      return array;
    }
    
    /**
     * 转换为64为的String字符串
     *
     * @param input int 数组
     * @return 转换后的散列密钥
     */
    private static String convertTo64(int[] input) {
      String base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      String ret = "";
      int i = 0;
      int j = 0;
      int[] char_array_3 = new int[3];
      int[] char_array_4 = new int[4];
      int in_len = input.length;
      int pos = 0;
    
      while (in_len-- != 0) {
          char_array_3[i++] = input[pos++];
          if (i == 3) {
              char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
              char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
              char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
              char_array_4[3] = char_array_3[2] & 0x3f;
    
              for (i = 0; (i < 4); i++)
                  ret += base64_chars.charAt(char_array_4[i]);
              i = 0;
          }
      }
    
      if (i != 0) {
          for (j = i; j < 3; j++)
              char_array_3[j] = 0;
    
          char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
          char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
          char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
          char_array_4[3] = char_array_3[2] & 0x3f;
    
          for (j = 0; (j < i + 1); j++)
              ret += base64_chars.charAt(char_array_4[j]);
    
          while ((i++ < 3))
              ret += '=';
    
      }
      return ret;
     }
}

kotlin版的如下

 /**
  * 转换工具类
  */
 object ConvertUtil {

/**
 * 转换
 *
 * @param input   输入的内容
 * @param isCheck 是否取消选择OX
 * @return 返回散列密钥
 */
fun convert(input: String, isCheck: Boolean): String {
    val array: String
    val result = input(input, isCheck)
    if (result.length % 2 != 0) {
        return "123"
    }
    val mArray = IntArray(result.length / 2)
    for (index in 0 until result.length / 2) {
        val h = result.substring(index * 2, index * 2 + 2)
        mArray[index] = h.toInt(16)
    }
    array = convertTo64(mArray)
    return array
}

/**
 * 输入内容
 *
 * @param input   输入的内容
 * @param isCheck 是否取消选择OX
 * @return 返回取消OX后的值
 */
private fun input(input: String, isCheck: Boolean): String {
    var input = input
    input = input.toUpperCase()
    if (isCheck) {
        val pattern = Pattern.compile("0X")
        val matcher = pattern.matcher(input)
        input = matcher.replaceAll("")
    }
    val pattern = Pattern.compile("[^A-Fa-f0-9]")
    val matcher = pattern.matcher(input)
    input = matcher.replaceAll("")
    return input
}


/**
 * 转换为64为的String字符串
 *
 * @param input int 数组
 * @return 转换后的散列密钥
 */
private fun convertTo64(input: IntArray): String {
    val base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    var ret = ""
    var i = 0
    var j = 0
    val char_array_3 = IntArray(3)
    val char_array_4 = IntArray(4)
    var in_len = input.size
    var pos = 0
    while (in_len-- != 0) {
        char_array_3[i++] = input[pos++]
        if (i == 3) {
            char_array_4[0] = char_array_3[0] and 0xfc shr 2
            char_array_4[1] =
                (char_array_3[0] and 0x03 shl 4) + (char_array_3[1] and 0xf0 shr 4)
            char_array_4[2] =
                (char_array_3[1] and 0x0f shl 2) + (char_array_3[2] and 0xc0 shr 6)
            char_array_4[3] = char_array_3[2] and 0x3f
            i = 0
            while (i < 4) {
                ret += base64_chars[char_array_4[i]]
                i++
            }
            i = 0
        }
    }
    if (i != 0) {
        j = i
        while (j < 3) {
            char_array_3[j] = 0
            j++
        }
        char_array_4[0] = char_array_3[0] and 0xfc shr 2
        char_array_4[1] = (char_array_3[0] and 0x03 shl 4) + (char_array_3[1] and 0xf0 shr 4)
        char_array_4[2] = (char_array_3[1] and 0x0f shl 2) + (char_array_3[2] and 0xc0 shr 6)
        char_array_4[3] = char_array_3[2] and 0x3f
        j = 0
        while (j < i + 1) {
            ret += base64_chars[char_array_4[j]]
            j++
        }
        while (i++ < 3) ret += '='
    }
    return ret
}
}
  • 3、关于Facebook如何配置,如果不太明白的话可以看看这篇:Facebook 配置,关于如何配置散列密钥?可以看下图
    ![加入google签名计划后的散列密钥.png](Android 关于加入Google签名计划(分配的签名文件)Google和Facebook登录不成功的问题/加入google签名计划后的散列密钥.png)
    如上图所示这里的散列密钥换成刚生成的即可。

    最后

    好了,到此我们今天的文章就结束了。关于如何解决Google和Facebook加入签名计划后不能成功登录的问题就到此结束了。如果还有其他问题可以加群探讨,群号是:493180098